<?php
declare(strict_types=1);

namespace WebApp\lib\db\mysql;

use WebApp\lib\db\Pool;

/**
 * Class MysqlPool
 * @package server\lib
 */
class MysqlPool extends Pool
{


    public function __construct(MysqlDriver $driver)
    {
        parent::__construct($driver);
    }
//
//    /**
//     * @param $func
//     * @return mixed
//     */
////    public function exec($func, Table $executor)
//    public function exec($func)
//    {
//        return $func($this->getCon());
//
//        for($i=0; $i < 2; $i++) {
//            $query = function() use($func){
//                $start = microtime(true);
//                $pdo_func = function() {
//                    $con = $this->getPdo();
//                    return $con;
//                };
//
//                $dao_instance = '';
//                $exe = new class ($pdo_func, $dao_instance) implements IMysqlExecute{
//                    /**
//                     * @var PDO
//                     */
//                    private $pdo;
//
//                    /**
//                     * @var callable
//                     */
//                    private $pdo_func;
//                    /**
//                     * @var string
//                     */
//                    private $dao_instance;
//
//                    public function __construct(callable $pdo_func, string $dao_instance)
//                    {
//                        $this->pdo_func = $pdo_func;
//                        $this->dao_instance = $dao_instance;
//                    }
//
//                    public function getPdo(): PDO
//                    {
//                        if (!$this->pdo) {
//                            $this->pdo = call_user_func_array($this->pdo_func, []);
//                        }
//                        return $this->pdo;
//                    }
//
//                    public function getDaoInstance(&$db_str = null): string
//                    {
//                        return $this->dao_instance;
//                    }
//                };
//
//                $res = $func($exe);
//
//                $end = microtime(true);
//                $t_res = ($end - $start) * 1000;
//                if ($t_res > 800) {
////                    LogHelper::LOGI("cost too long $t_res", 0, false);
//                }
//                return $res;
//            };
//
//            try {
//                return $query();
//            } catch (ClientOkException $e) {
//                throw $e;
//            } catch (\Throwable $e) {
//                LogHelper::logD(
//                    'sql_error |||'. $e->getMessage()
//                    . "|" . $e->getCode()
//                    . "|" . $executor->getLastSql()
//                    . "|" . $executor->getDb()->getLastErrCode()
//                    . "|" . $executor->getDb()->getLastErrInfo()
//                    . "|" . json_encode($executor->getDb()->getLastParams())
//                );
//
//                var_dump(debug_backtrace());
//                if (Util::hasString($e->getMessage(), "has gone away")) {
//                    $executor->getDb()->clear();
//                    continue;
//                }
//                if (Util::hasString($e->getMessage(), "2002")) {
//                    $executor->getDb()->clear();
//                    continue;
//                }
//                Util::logJson(debug_backtrace(), '', null, false);
//                return false;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * @return Mysql
//     */
//    private function get()
//    {
//        //有空闲连接
//        if (count($this->pool) > 0) {
//            return $this->pool->pop();
//        }
//
//        //无空闲连接，创建新连接
//        $client = new Mysql();
//        $config = [
//            'host' => $this->getHost(),
//            'user' => $this->getUser(),
//            'password' => $this->getPwd(),
//            'database' => $this->db_name,
//            'port' => $this->getPort(),
//            'timeout'=> 100,
//            'charset' => 'utf8mb4'
//        ];
//
//        $res = $client->connect(
//            $config
//        );
//        if ($res == false) {
//            return null;
//        } else {
////            $client->query("set character_set_client=utf8mb4;");
////            $client->query("set character_set_connection=utf8mb4;");
////            $client->query("set character_set_results=utf8mb4;");
////            $client->query("set character_set_database=utf8mb4;");
////            $client->query("set character_set_server=utf8mb4;");
//            return $client;
//        }
//    }
}
